#ifndef __MINUTERIE_H
#define __MINUTERIE_H

#include "weather_report.h"

/**
 * Foncteur exécutant une attente nulle.
 */
struct sans_attente {
	void operator()() {}
};

/**
 * Foncteur exécutant une attente, par défaut 100ms.
 */
template <temps::type_temps t = 100>
struct avec_attente {
	void operator()() { temps::attendre(t); }
};

/**
 * Classe décrivant une minuterie de cuisine, utilisable dans une boucle :
 * Exemple d'utilisation :
 minuterie<> m(500);	// 500 ms, attente toutes les 100ms par défaut
 while(!m)				// (bool)m <=> test + attente //// m.depasse() <=> test
	cout << "Je fais pipi." << endl;
 cout << "Ayé j'ai fini !" << endl;
 */
template <class T = avec_attente<100> >
struct minuterie {
	typedef temps::type_temps type_temps;
private:
	type_temps top_, timeout_;
	T attendre_;
public:
	minuterie(type_temps timeout = 1000) : top_(temps::maintenant()), timeout_(timeout) {}
	type_temps temps_ecoule() { return temps::maintenant() - top_; }
	void reset() { top_ = temps::maintenant(); }
	operator bool() { type_temps delta = temps::maintenant() - top_; if(delta < timeout_) attendre_(); return delta > timeout_; }
	bool depasse() { return temps_ecoule() > timeout_; }
	operator type_temps() { return temps_ecoule(); }
};

#endif
